/**
 * L9Sound.h
 *
 *  Created on: 2011-10-18
 *      Author: baixp
 */

#ifndef L9SOUND_H_
#define L9SOUND_H_
#include <FBase.h>
#include <FSystem.h>
#include <FMedia.h>
#include "L9Util.h"
#include "L9Sprite.h"
#include <vector>
using namespace std;
using namespace Osp::Media;
using namespace Osp::Base::Runtime;
namespace lib9bada {
/**
 * 本来打算使用线程的方式来播放声音的，但是发现在线程中IPlayerEventListener接口中的回调函数无法执行,所以修改为了Timer的方式
 */
class L9Sound: public /*IRunnable*/ITimerEventListener, public IPlayerEventListener {
private:
	int _cmd;
	int _channel;
	int _sound_id;
	int _loop;
	bool _bFreeRes;
	vector<int> _loopRec;
	vector<int> _loopSoundID;

	vector<Player*> _players;
	vector<pByte> _sound_data;
	bool bRun;

	void _playSound(int channel, int id, int loop);

	void _stopSound(int channel,bool bFreeRes=true);
	/**
	 * 使用soundData数据来强制创建Player
	 *
	 * @param soundData
	 *            byte[]
	 * @return Player
	 */
	Player* createPlayer(pByte _soundData);
	void _initSound(L9Sprite& sprite, int nChannel);
	void defaultInit();
public:
	/**
	 * L9Sound使用L9Sprite提供的声音数据资源来创建，参数nChannel为播放频道,常常设置为2，一个代表背景音乐，一个代表播放的声音
	 *
	 * @param sprite
	 *            L9Sprite
	 * @param nChannel
	 *            int
	 */
	L9Sound(L9Sprite& sprite, int nChannel);

	/**
	 * L9Sound使用L9Sprite提供的声音数据资源来创建，默认播放频道数为2，一个代表背景音乐，一个代表播放的声音
	 *
	 * @param sprite
	 *            L9Sprite
	 */
	L9Sound(L9Sprite& sprite);
	virtual ~L9Sound();


	static const int K_Sound_Cmd_Play = 0;
	static const int K_Sound_Cmd_Stop = 1;
	static const int K_Sound_Cmd_StopAll = 2;

	virtual void  OnPlayerBuffering (int percent);
	virtual void  OnPlayerEndOfClip (void);// 如果是循环播放则减少播放次数
	virtual void  OnPlayerErrorOccurred (PlayerErrorReason r);
	virtual void  OnPlayerInterrupted (void);
	virtual void  OnPlayerOpened (result r);
	virtual void  OnPlayerReleased (void);
	virtual void  OnPlayerSeekCompleted (result r);



	//Object* Run();
	void OnTimerExpired(Timer& timer);

	/**
	 * 播放某个频道上的声音,每个频道同时只能播放一个声音
	 *
	 * @param channel
	 *            int
	 * @param id
	 *            int
	 * @param loop
	 *            int
	 */
	void playSound(int channel, int id, int loop);

	/**
	 * 判断是否还在播放
	 *
	 * @param channel
	 *            int
	 * @return bool
	 */
	bool isPlaying(int channel);

	/**
	 * 停止某个频道上的声音
	 *
	 * @param channel
	 *            int
	 */
	void stopSound(int channel,bool bFreeRes=true);

	/**
	 * 停止全部声音
	 */
	void stopAllSound();

	/**
	 * L9Sound声音播放采用了独立的线程模式来播放声音，endSoundThread()方法就是用来结束声音播放线程的，往往在程序退出之前调用
	 */
	void endSoundThread();

};
};

#endif /* L9SOUND_H_ */
